package com.leetcode.根据数据结构分类.栈;

import java.util.HashSet;
import java.util.Stack;

/**
 * @author: ZhouBert
 * @date: 2020/11/20
 * @description: https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
 */
public class B_150_逆波兰表达式求值 {

	/**
	 * 这道题其实不难，因为对于该知识点了解的话自然就会知道算法该怎么写
	 * --
	 * 维护两个栈，一个是数字栈，一个是符号栈
	 *
	 * @param tokens
	 * @return
	 */
	public int evalRPN(String[] tokens) {
		//预先设定符号数
		HashSet<String> set = new HashSet<>();
		set.add("+");
		set.add("-");
		set.add("*");
		set.add("/");


		//维护一个操作数栈//既然运算符位于操作数之后，那么就不需要维护一个操作数的栈了
		//Stack<String> opeStack = new Stack<>();
		//维护一个数字栈
		Stack<Integer> numStack = new Stack<>();
		for (int i = 0; i < tokens.length; i++) {
			//数字入栈
			if (!set.contains(tokens[i])) {
				numStack.add(Integer.parseInt(tokens[i]));
			} else {
				//是操作符就进行运算
				int right = numStack.pop();
				int left = numStack.pop();
				int temp = calc(left, tokens[i], right);
				numStack.push(temp);
			}
		}
		return numStack.pop();
	}

	private int calc(int left, String ope, int right) {
		int res = 0;
		switch (ope) {
			case "+":
				res = left + right;
				break;
			case "-":
				res = left - right;
				break;
			case "*":
				res = left * right;
				break;
			case "/":
				res = left / right;
				break;
		}
		return res;
	}


}
